# 正则表达书
# re 模块使 Python 语言拥有全部的正则表达式功能。
# compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。

#!/usr/bin/python
import re
print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.match('com', 'www.runoob.com'))         # 不在起始位置匹配

#!/usr/bin/python3
line = "Cats are smarter than dogs"
# .* 表示任意匹配除换行符（\n、\r）之外的任何单个或多个字符
# (.*?) 表示"非贪婪"模式，只保存第一个匹配到的子串
matchObj = re.match(r'(.*) are (.*?) .*', line, re.M | re.I)
if matchObj:
    print("matchObj.group() : ", matchObj.group())
    print("matchObj.group(1) : ", matchObj.group(1))
    print("matchObj.group(2) : ", matchObj.group(2))
else:
    print("No match!!")

#!/usr/bin/python
print(re.search('www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span())         # 不在起始位置匹配

#!/usr/bin/python3
line = "Cats are smarter than dogs"
searchObj = re.search(r'(.*) are (.*?) .*', line, re.M | re.I)
if searchObj:
    print("searchObj.group() : ", searchObj.group())
    print("searchObj.group(1) : ", searchObj.group(1))
    print("searchObj.group(2) : ", searchObj.group(2))
else:
    print("Nothing found!!")

#!/usr/bin/python3
line = "Cats are smarter than dogs"
matchObj = re.match(r'dogs', line, re.M | re.I)
if matchObj:
    print("match --> matchObj.group() : ", matchObj.group())
else:
    print("No match!!")
matchObj = re.search(r'dogs', line, re.M | re.I)
if matchObj:
    print("search --> matchObj.group() : ", matchObj.group())
else:
    print("No match!!")

# re模块提供了re.sub用于替换字符串中的匹配项。
#!/usr/bin/python3
phone = "2004-959-559 # 这是一个电话号码"
# 删除注释
num = re.sub(r'#.*$', "", phone)
print("电话号码 : ", num)
# 移除非数字的内容
num = re.sub(r'\D', "", phone)
print("电话号码 : ", num)

# repl 参数是一个函数
# 将字符串中的匹配的数字乘于 2：
# 将匹配的数字乘于 2：
def double(matched):
    value = int(matched.group('value'))
    return str(value*2)
s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))

# compile函数
pattern = re.compile(r'\d+')    # 用于匹配至少一个数字
m = pattern.match('one12twothree34four')    # 查找头部，没有匹配
print(m)
m = pattern.match('one12twothree34four', 2, 10)   # 从e的位置开始匹配，没有匹配
print(m)
m = pattern.match('one12twothree34four', 3, 10)   # 从1的位置开始匹配，正好匹配
print(m)    # 返回一个 Match 对象
print(m.group(0))   # 可省略 0
print(m.start(0))   # 可省略 0
print(m.end(0))     # 可省略 0
print(m.span(0))    # 可省略 0
print(m.group())    # 等价于 (m.group(1), m.group(2), ...)

# findall    match 和 search 是匹配一次 findall 匹配所有。
result = re.findall(r'\d+', 'Daniel 123 google 456')
pattern = re.compile(r'\d+')    # 查找数字
result1 = pattern.findall('Daniel 123 google 456')
result2 = pattern.findall('run88oob123google456', 0, 10)
print(result)
print(result1)
print(result2)
# re.finditer   和 findall 类似，在字符串中找到正则表达式所匹配的所有子串，并把它们作为一个迭代器返回。
it = re.finditer(r"\d+", "12a32bc43jf3")
for match in it:
    print(match.group())
# re.split    split 方法按照能够匹配的子串将字符串分割后返回列表
print(re.split('\W+', 'Daniel,Daniel,Daniel.'))
print(re.split('(\W+)', ' Daniel, Daniel, Daniel.'))
print(re.split('\W+', ' Daniel, Daniel, Daniel.', 1))
print(re.split('a+', 'hello world'))   # 对于一个找不到匹配的字符串而言，split 不会对其作出分割
